﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Riel_Gestion.entities;
using Riel_Gestion.dao;
using Printing.DataGridViewPrint.Tools;
using System.Drawing.Printing;
using Riel_Gestion.printer;
using log4net;

namespace Riel_Gestion
{
    public partial class FrmFichaProveedor : Form
    {
        private static readonly ILog logger = LogManager.GetLogger(typeof(FrmFichaProveedor));
        private static String ID_FECHA_PRED = "fechaPred";

        String idProveedor = null;
        Decimal debe = 0;
        Decimal haber = 0;
        Decimal saldoAnt = 0;
        Decimal saldoAcum = 0;

        int filasAct = 0;

        public String IdProveedor
        {
            get { return idProveedor; }
            set { idProveedor = value; }
        }

        public FrmFichaProveedor()
        {
            InitializeComponent();
        }

        private void FrmFichaProveedor_Load(object sender, EventArgs e)
        {
            logger.Info("Cargando datos del formulario FrmFichaProveedor");
            ToolTip toolTipEditar = new ToolTip();
            ToolTip toolTipEliminar = new ToolTip();
            toolTipEditar.SetToolTip(this.btnEditarProveedor, "Editar los datos del proveedor");
            toolTipEliminar.SetToolTip(this.btnEliminar, "Eliminar proveedor");

            DTOProveedor prov = ProveedorDAO.getData(idProveedor);

            //Mapeo de datos del cliente con los labels
            lblProv.Text = prov.CodProveedor.ToString();
            lblDireccion.Text = prov.Direccion;
            lblNombre.Text = prov.Nombre;
            this.Text += lblProv.Text;

            //Cargo del datagrid
            dtpFDesde.Value = getFecha();
            this.cOMPRATableAdapter.FillByIDAndDates(rielDataSet.COMPRA, int.Parse(idProveedor), dtpFDesde.Value.Date);

            filasAct = cOMPRADataGridView.RowCount;
        }

        private void btnEditarProveedor_Click(object sender, EventArgs e)
        {
            logger.Info("Accediendo a FrmModificarProveedor...");
            FrmModificarProveedor frmModificarProveedor = new FrmModificarProveedor(IdProveedor);
            frmModificarProveedor.ShowDialog();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            DialogResult dialogResult = MessageBox.Show("¿Esta seguro que desea eliminar el proveedor?", "Eliminar Proveedor", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
            if (dialogResult == DialogResult.Yes)
            {
                logger.Info("Eliminando Proveedor: " + IdProveedor);

                //Primero hay que eliminar las compras hechas al proveedor
                int res = cOMPRATableAdapter.DeleteQueryByIDProveedor(int.Parse(idProveedor));

                if (res > 0)
                {
                    logger.Info("Se eliminaron " + res + " compras al proveedor " + idProveedor);
                    FrmMain.showInfoDialog("Se eliminaron " + res + " compras al proveedor " + idProveedor, "Compras...");

                    rielDataSetTableAdapters.CLIENTETableAdapter cliente = new Riel_Gestion.rielDataSetTableAdapters.CLIENTETableAdapter();

                    res = cliente.DeleteQueryByID(int.Parse(idProveedor));

                    if (res > 0)
                    {
                        logger.Info("Se eliminaron los datos personales del proveedor");
                        FrmMain.showInfoDialog("Se eliminaron los datos personales del proveedor", "Datos eliminados");
                    }
                    if (res < 0)
                    {
                        logger.Error("Error al eliminar datos personales del proveedor");
                        FrmMain.showErrorDialog("Error al eliminar datos personales del proveedor");
                    }

                }

                if (res == 0)
                {
                    logger.Info("No hay compras a eliminar para el proveedor " + idProveedor);
                    FrmMain.showInfoDialog("No hay compras a eliminar para el proveedor " + idProveedor, "No se eliminaron ventas");
                }

                if (res < 0)
                {
                    logger.Error("Error al eliminar compras para el proveedor " + idProveedor);
                    FrmMain.showErrorDialog("Error al eliminar compras para el proveedor " + idProveedor);
                }                
            }

            this.Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (filasAct != cOMPRADataGridView.RowCount)
                if (FrmMain.showInfoYesNoDialog("¿Desea guardar los cambios?", "Ficha Vendedor") == DialogResult.Yes)
                    cOMPRABindingNavigatorSaveItem_Click(sender, e);

            this.Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            FrmVenta frmVenta = new FrmVenta();
            frmVenta.ShowDialog();
        }

        private void cOMPRABindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            int res = 0;
            this.Validate();
            this.cOMPRABindingSource.EndEdit();

            DataRowCollection rowc = this.rielDataSet.Tables["COMPRA"].Rows;

            foreach (DataRow dr in rowc)
            {
                if (!idProveedor.Equals(dr["CODPROVEEDOR"].ToString()))
                {
                    logger.Info("Agregando Compra al proveedor: " + IdProveedor);

                    int codProveedor = int.Parse(idProveedor);
                    DateTime dateTime = (DateTime)dr["FECHAHORA"];
                    String desc = (String)dr["DESCRIPCION"];
                    Decimal debe = (Decimal)dr["IMPORTEVENTA"];
                    Decimal haber = (Decimal)dr["IMPORTEPAGO"];
                    Decimal saldo = (Decimal)dr["SALDO"];

                    res = cOMPRATableAdapter.Insert(codProveedor, dateTime, desc, debe, haber, saldo);

                    if (res == 0)
                    {
                        logger.Error("No se pudo agregar Compra");
                        MessageBox.Show("No se pudo agregar la compra al proveedor", "Nueva Compra", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
            if (res > 0)
            {
                logger.Info("Compra agregada correctamente");
                FrmMain.showInfoDialog("Compra agregada correctamente", "Nueva Compra");
            }

        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {

            PrinterImpl printer = new PrinterImpl(cOMPRADataGridView, "Ficha Proveedor: " + idProveedor);
            
            printPreviewDialog.Document = printer.getDocument();
            if(printPreviewDialog.ShowDialog() == DialogResult.OK)
            {
                logger.Info("Imprimiendo documento...");
                printer.print();
            }
        }

        private void dtpFDesde_ValueChanged(object sender, EventArgs e)
        {
            logger.Info("Recargando la tabla de compras con la fecha: " + dtpFDesde.Value.Date.ToString());
            this.cOMPRATableAdapter.FillByIDAndDates(rielDataSet.COMPRA, int.Parse(idProveedor), dtpFDesde.Value.Date);            
        }

        private void cOMPRADataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                if (e.RowIndex == (cOMPRADataGridView.RowCount - 1))
                {
                    if (e.RowIndex == 0)
                    {
                        saldoAnt = 0;
                        cOMPRADataGridView.Rows[e.RowIndex].Cells[4].Value = saldoAnt;
                    }
                    else
                    {
                        cOMPRADataGridView.Rows[e.RowIndex].Cells[4].Value = cOMPRADataGridView.Rows[e.RowIndex - 1].Cells[4].Value;
                        saldoAnt = Decimal.Parse(cOMPRADataGridView.Rows[e.RowIndex].Cells[4].Value.ToString());
                    }
                }
            }

            if (e.ColumnIndex == 2)
            {
                //Verifico que las celdas no queden vacias
                if ("".Equals(cOMPRADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString()))
                    cOMPRADataGridView.Rows[e.RowIndex].Cells[2].Value = 0;

                if ("".Equals(cOMPRADataGridView.Rows[e.RowIndex].Cells[3].Value.ToString()))
                    cOMPRADataGridView.Rows[e.RowIndex].Cells[3].Value = 0;

                cOMPRADataGridView.Rows[e.RowIndex].Cells[4].Value = saldoAnt + Decimal.Parse(cOMPRADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString()) - Decimal.Parse(cOMPRADataGridView.Rows[e.RowIndex].Cells[3].Value.ToString());
            }

            if (e.ColumnIndex == 3)
            {
                //Verifico que las celdas no queden vacias
                if ("".Equals(cOMPRADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString()))
                    cOMPRADataGridView.Rows[e.RowIndex].Cells[2].Value = 0;

                if ("".Equals(cOMPRADataGridView.Rows[e.RowIndex].Cells[3].Value.ToString()))
                    cOMPRADataGridView.Rows[e.RowIndex].Cells[3].Value = 0;

                cOMPRADataGridView.Rows[e.RowIndex].Cells[4].Value = saldoAnt + Decimal.Parse(cOMPRADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString()) - Decimal.Parse(cOMPRADataGridView.Rows[e.RowIndex].Cells[3].Value.ToString());
            }          
        }

        private void cOMPRADataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 && e.RowIndex == cOMPRADataGridView.Rows.Count - 1)
                cOMPRADataGridView.Rows[e.RowIndex].Cells[0].Value = DateTime.Now.Date;
        }

        private void cOMPRADataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            if (e.Exception.GetType().ToString().Equals("System.FormatException"))
            {
                //Valido Fecha
                if (e.ColumnIndex == 0)
                    MessageBox.Show("La fecha ingresada es incorrecta!\nIngrese una fecha con formato dia/mes/año.", "Error en fecha", MessageBoxButtons.OK, MessageBoxIcon.Error);

                if (e.ColumnIndex > 1)
                {
                    Decimal result;
                    if (!Decimal.TryParse(cOMPRADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString(), out result))
                    {
                        showDialogError(e.ColumnIndex);
                    }
                }
            }
        }

        private void showDialogError(int col)
        {
            MessageBox.Show("El valor ingresado para la columna " + cOMPRADataGridView.Columns[col].HeaderText + " no es válido.", "Error en campo", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private DateTime getFecha()
        {
            int fechaPred = int.Parse(LocalProperties.getInstance().getProperty(ID_FECHA_PRED));
            DateTime dt = DateTime.Now.Date;
            switch (fechaPred)
            {
                case 1://Semanal
                    dt = DateTime.Now.Date.AddDays(-7);
                    break;
                case 2://Mensual
                    dt = DateTime.Now.Date.AddMonths(-1);
                    break;
                case 3://Bimestral
                    dt = DateTime.Now.Date.AddMonths(-2);
                    break;
                case 4://Trimestral
                    dt = DateTime.Now.Date.AddMonths(-3);
                    break;
                case 5://Semestral
                    dt = DateTime.Now.Date.AddMonths(-6);
                    break;
                case 6://Anual
                    dt = DateTime.Now.Date.AddYears(-1);
                    break;
            }
            return dt;
        }
    }

}
